#include "app_router.h"
#include "app_mqtt.h"
#include "app_device.h"
#include "log.h"

#define DEVICE_NUM_MAX 3
static Device *device_list[DEVICE_NUM_MAX];
static int device_num=0;

/**
 * 向app_mqtt模块 注册 接收消息的回调函数（app_router_dispatch_msg_to_device）
 */
int app_router_init()
{   
    log_info("设备模块初始化:向app_mqtt模块 注册 接收消息的回调函数 ");
    app_mqtt_register_recv_callback(app_router_dispatch_msg_to_device);
    return 0;
}

/**
 * 接收设备的注册 并启动该设备
 * 1  把设备加入到设备列表中
 * 2  启动设备
 */
int  app_router_register_device(Device *device)
{   log_info("设备模块:接收设备的注册 并启动该设备");
     // 1  把设备加入到设备列表中
     device_list[device_num++]=device;
     //2   启动设备
     app_device_start(device);
     return 0;
}
 
/**
 * 该方法会注册给消息队列模块 ，用于接受消息队列的消息
 * 执行内容： 把数据分发给对应的设备
 * 1  把json 转换成message 
 *2  把message中的conn_type提取出来  
 * 3  用message的conn_type   和设备列表中 设备的conn_type进行对比
 * 4  如果匹配 ，把message 发送给 设备(调用该设备的app_device_recv_from_router 的方法)
 */
int  app_router_dispatch_msg_to_device(char *json)
{
    //1  把json 转换成message 
    Message *message= app_message_json_to_message(json);
    if(message == NULL)
    {
        log_error("app_router_dispatch_msg_to_device: app_message_json_to_message failed");
        return -1;
    }
    //2  把message中的conn_type提取出来
    //3  用message的conn_type   和设备列表中 设备的conn_type进行对比
    for (int i = 0; i < device_num; i++)
    {   log_info("message->conn_type:%d" ,message->conn_type);
        log_info("device_list[i]->conn_type:%d" ,device_list[i]->conn_type);

         if(message->conn_type == device_list[i]->conn_type)
         {
            //如果匹配 ，把message 发送给 设备(调用该设备的app_device_recv_from_router 的方法)
            int ret= app_device_recv_from_router(device_list[i],message);
            if (ret<0)
            {
                log_error("app_router_recv_from_device error");
                return -1;
            }
 
         }
    }
    return 0;
    
}

void app_router_devicelist_destroy()
{
    for (size_t i = 0; i < device_num; i++)
    {
        app_device_destroy(device_list[i])   ;
    }
    
}